package cn.lg.soar.system.biz.filetemplate;

import cn.lg.soar.system.biz.filetemplate.model.PartInfoVO;
import cn.lg.soar.system.biz.modules.general.entity.FileStorage;
import com.amazonaws.services.s3.model.S3Object;

import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.List;

/**
 * @author luguoxiang 469599794@qq.com
 * @Date: 2024/3/1 17:25
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface FileTemplate {

    /**
     * 上传文件
     * @param directory 目录
     * @param filename 文件名称
     * @param stream 文件流
     * @throws Exception
     */
    void upload(String filename, InputStream stream);

    /**
     * 获取文件流
     * @param directory 目录
     * @param filename 文件名称
     * @return
     */
    InputStream getInputStream(String filename);

    /**
     * 获取文件
     * @param filename 文件名称
     * @return S3Object
     */
    S3Object getObject(String filename);

    /**
     * 删除文件
     * @param filename
     * @throws Exception
     */
    void deleteFile(String filename);

    /**
     * 文件是否存在
     * @param filename
     * @return
     */
    boolean isExist(String filename);

    /**
     * 获取访问路径
     * @param filename
     * @return
     */
    URL getUrl(String filename);

    /**
     * 获取访问路径
     * @param filename
     * @param date
     * @return
     */
    URL getAccessUrl(String filename, Date date);

    /**
     * 获取上传路径
     * @param filename
     * @return
     */
    String getUploadUrl(String filename);

    /**
     * 获取分片上传路径
     * @param filename
     * @param uploadId
     * @param partNumber
     * @return
     */
    String getUploadUrl(String filename, String uploadId, Integer partNumber);

    /**
     * 分片上传初始化
     * @param filename
     * @return
     */
    String uploadInit(String filename);

    /**
     * 分片上传完成
     * @param filename
     * @param uploadId
     * @param parts
     */
    void uploadComplete(String filename, String uploadId, List<PartInfoVO> parts);

    /**
     * 分片上传中止
     * @param filename
     * @param uploadId
     */
    void uploadAbort(String filename, String uploadId);

    /**
     * 获取配置版本
     * @return
     */
    int getConfigVersion();

    /**
     * 测试是否可用
     * @return
     */
    void test();

    /**
     * 创建实例
     * @param fileStorage
     * @return
     */
    static FileTemplate create(FileStorage fileStorage) {
        switch (fileStorage.getType()) {
            case AMAZON_S3: return new AmazonS3FileTemplateImpl(fileStorage);
            default: return new LocalFileTemplateImpl(fileStorage);
        }
    }

}